import { assertEquals } from "../deps.ts";
import solveSudoku from "./index.ts";

Deno.test("sudoku-solver", () => {
    const inputs = [
        [
            ["5", "3", "4", "6", "7", "8", "9", "1", "2"],
            ["6", "7", "2", "1", "9", "5", "3", "4", "8"],
            ["1", "9", "8", "3", "4", "2", "5", "6", "7"],
            ["8", "5", "9", "7", "6", "1", "4", "2", "3"],
            ["4", "2", "6", "8", "5", "3", "7", "9", "1"],
            ["7", "1", "3", ".", "2", "4", "8", "5", "6"],
            ["9", "6", "1", "5", "3", "7", "2", "8", "4"],
            ["2", "8", "7", "4", "1", "9", "6", "3", "5"],
            ["3", "4", "5", "2", "8", "6", "1", "7", "9"],
        ],
        [
            ["5", "3", ".", ".", "7", ".", ".", ".", "."],
            ["6", ".", ".", "1", "9", "5", ".", ".", "."],
            [".", "9", "8", ".", ".", ".", ".", "6", "."],
            ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
            ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
            ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
            [".", "6", ".", ".", ".", ".", "2", "8", "."],
            [".", ".", ".", "4", "1", "9", ".", ".", "5"],
            [".", ".", ".", ".", "8", ".", ".", "7", "9"],
        ],
        [
            [".", ".", "9", "7", "4", "8", ".", ".", "."],
            ["7", ".", ".", ".", ".", ".", ".", ".", "."],
            [".", "2", ".", "1", ".", "9", ".", ".", "."],
            [".", ".", "7", ".", ".", ".", "2", "4", "."],
            [".", "6", "4", ".", "1", ".", "5", "9", "."],
            [".", "9", "8", ".", ".", ".", "3", ".", "."],
            [".", ".", ".", "8", ".", "3", ".", "2", "."],
            [".", ".", ".", ".", ".", ".", ".", ".", "6"],
            [".", ".", ".", "2", "7", "5", "9", ".", "."],
        ],
        [
            [".", ".", "5", "3", ".", ".", ".", ".", "."],
            ["8", ".", ".", ".", ".", ".", ".", "2", "."],
            [".", "7", ".", ".", "1", ".", "5", ".", "."],
            ["4", ".", ".", ".", ".", "5", "3", ".", "."],
            [".", "1", ".", ".", "7", ".", ".", ".", "6"],
            [".", ".", "3", "2", ".", ".", ".", "8", "."],
            [".", "6", ".", "5", ".", ".", ".", ".", "9"],
            [".", ".", "4", ".", ".", ".", ".", "3", "."],
            [".", ".", ".", ".", ".", "9", "7", ".", "."],
        ],
        [
            ["5", "3", "4", "6", "7", "8", ".", "1", "2"],
            ["6", "7", "2", "1", "9", "5", "3", "4", "8"],
            ["1", "9", "8", "3", "4", "2", "5", "6", "7"],
            ["8", "5", "9", "7", "6", "1", "4", "2", "3"],
            ["4", "2", "6", "8", "5", "3", "7", "9", "1"],
            ["7", "1", "3", "9", "2", "4", "8", "5", "6"],
            ["9", "6", "1", "5", "3", "7", "2", "8", "4"],
            ["2", "8", "7", "4", "1", "9", "6", "3", "5"],
            ["3", "4", "5", "2", "8", "6", "1", "7", "9"],
        ],
        [
            [".", ".", "9", "7", "4", "8", ".", ".", "."],
            ["7", ".", ".", ".", ".", ".", ".", ".", "."],
            [".", "2", ".", "1", ".", "9", ".", ".", "."],
            [".", ".", "7", ".", ".", ".", "2", "4", "."],
            [".", "6", "4", ".", "1", ".", "5", "9", "."],
            [".", "9", "8", ".", ".", ".", "3", ".", "."],
            [".", ".", ".", "8", ".", "3", ".", "2", "."],
            [".", ".", ".", ".", ".", ".", ".", ".", "6"],
            [".", ".", ".", "2", "7", "5", "9", ".", "."],
        ],
        [
            [".", "9", ".", "6", ".", ".", "3", ".", "."],
            [".", "3", ".", ".", "5", ".", ".", "2", "8"],
            ["5", ".", "1", ".", ".", "2", "7", ".", "."],
            [".", ".", "6", "1", ".", "8", ".", ".", "2"],
            [".", "1", ".", ".", ".", ".", ".", "3", "."],
            ["8", ".", ".", "5", ".", "9", "6", ".", "."],
            [".", ".", "9", "7", ".", ".", "4", ".", "3"],
            ["1", "4", ".", ".", "2", ".", ".", "9", "."],
            [".", ".", "8", ".", ".", "6", ".", "7", "."],
        ],
        [
            [".", ".", "8", ".", "9", ".", ".", ".", "2"],
            [".", ".", ".", "1", ".", ".", "9", "7", "."],
            [".", ".", ".", ".", ".", "4", ".", "6", "."],
            [".", "1", ".", ".", ".", ".", "5", ".", "4"],
            [".", ".", "4", ".", "6", "5", "3", ".", "."],
            ["5", ".", "3", ".", ".", ".", ".", "9", "."],
            [".", "7", ".", "5", ".", ".", ".", ".", "."],
            [".", "8", "2", ".", ".", "3", ".", ".", "."],
            ["9", ".", ".", ".", "2", ".", "1", ".", "."],
        ],
    ];
    const outputs = [
        [
            ["5", "3", "4", "6", "7", "8", "9", "1", "2"],
            ["6", "7", "2", "1", "9", "5", "3", "4", "8"],
            ["1", "9", "8", "3", "4", "2", "5", "6", "7"],
            ["8", "5", "9", "7", "6", "1", "4", "2", "3"],
            ["4", "2", "6", "8", "5", "3", "7", "9", "1"],
            ["7", "1", "3", "9", "2", "4", "8", "5", "6"],
            ["9", "6", "1", "5", "3", "7", "2", "8", "4"],
            ["2", "8", "7", "4", "1", "9", "6", "3", "5"],
            ["3", "4", "5", "2", "8", "6", "1", "7", "9"],
        ],
        [
            ["5", "3", "4", "6", "7", "8", "9", "1", "2"],
            ["6", "7", "2", "1", "9", "5", "3", "4", "8"],
            ["1", "9", "8", "3", "4", "2", "5", "6", "7"],
            ["8", "5", "9", "7", "6", "1", "4", "2", "3"],
            ["4", "2", "6", "8", "5", "3", "7", "9", "1"],
            ["7", "1", "3", "9", "2", "4", "8", "5", "6"],
            ["9", "6", "1", "5", "3", "7", "2", "8", "4"],
            ["2", "8", "7", "4", "1", "9", "6", "3", "5"],
            ["3", "4", "5", "2", "8", "6", "1", "7", "9"],
        ],
        [
            ["5", "1", "9", "7", "4", "8", "6", "3", "2"],
            ["7", "8", "3", "6", "5", "2", "4", "1", "9"],
            ["4", "2", "6", "1", "3", "9", "8", "7", "5"],
            ["3", "5", "7", "9", "8", "6", "2", "4", "1"],
            ["2", "6", "4", "3", "1", "7", "5", "9", "8"],
            ["1", "9", "8", "5", "2", "4", "3", "6", "7"],
            ["9", "7", "5", "8", "6", "3", "1", "2", "4"],
            ["8", "3", "2", "4", "9", "1", "7", "5", "6"],
            ["6", "4", "1", "2", "7", "5", "9", "8", "3"],
        ],
        [
            ["1", "4", "5", "3", "2", "7", "6", "9", "8"],
            ["8", "3", "9", "6", "5", "4", "1", "2", "7"],
            ["6", "7", "2", "9", "1", "8", "5", "4", "3"],
            ["4", "9", "6", "1", "8", "5", "3", "7", "2"],
            ["2", "1", "8", "4", "7", "3", "9", "5", "6"],
            ["7", "5", "3", "2", "9", "6", "4", "8", "1"],
            ["3", "6", "7", "5", "4", "2", "8", "1", "9"],
            ["9", "8", "4", "7", "6", "1", "2", "3", "5"],
            ["5", "2", "1", "8", "3", "9", "7", "6", "4"],
        ],
        [
            ["5", "3", "4", "6", "7", "8", "9", "1", "2"],
            ["6", "7", "2", "1", "9", "5", "3", "4", "8"],
            ["1", "9", "8", "3", "4", "2", "5", "6", "7"],
            ["8", "5", "9", "7", "6", "1", "4", "2", "3"],
            ["4", "2", "6", "8", "5", "3", "7", "9", "1"],
            ["7", "1", "3", "9", "2", "4", "8", "5", "6"],
            ["9", "6", "1", "5", "3", "7", "2", "8", "4"],
            ["2", "8", "7", "4", "1", "9", "6", "3", "5"],
            ["3", "4", "5", "2", "8", "6", "1", "7", "9"],
        ],
        [
            ["5", "1", "9", "7", "4", "8", "6", "3", "2"],
            ["7", "8", "3", "6", "5", "2", "4", "1", "9"],
            ["4", "2", "6", "1", "3", "9", "8", "7", "5"],
            ["3", "5", "7", "9", "8", "6", "2", "4", "1"],
            ["2", "6", "4", "3", "1", "7", "5", "9", "8"],
            ["1", "9", "8", "5", "2", "4", "3", "6", "7"],
            ["9", "7", "5", "8", "6", "3", "1", "2", "4"],
            ["8", "3", "2", "4", "9", "1", "7", "5", "6"],
            ["6", "4", "1", "2", "7", "5", "9", "8", "3"],
        ],
        [
            ["7", "9", "2", "6", "8", "1", "3", "4", "5"],
            ["6", "3", "4", "9", "5", "7", "1", "2", "8"],
            ["5", "8", "1", "3", "4", "2", "7", "6", "9"],
            ["4", "7", "6", "1", "3", "8", "9", "5", "2"],
            ["9", "1", "5", "2", "6", "4", "8", "3", "7"],
            ["8", "2", "3", "5", "7", "9", "6", "1", "4"],
            ["2", "6", "9", "7", "1", "5", "4", "8", "3"],
            ["1", "4", "7", "8", "2", "3", "5", "9", "6"],
            ["3", "5", "8", "4", "9", "6", "2", "7", "1"],
        ],
        [
            ["7", "5", "8", "3", "9", "6", "4", "1", "2"],
            ["2", "4", "6", "1", "5", "8", "9", "7", "3"],
            ["1", "3", "9", "2", "7", "4", "8", "6", "5"],
            ["6", "1", "7", "9", "3", "2", "5", "8", "4"],
            ["8", "9", "4", "7", "6", "5", "3", "2", "1"],
            ["5", "2", "3", "8", "4", "1", "6", "9", "7"],
            ["3", "7", "1", "5", "8", "9", "2", "4", "6"],
            ["4", "8", "2", "6", "1", "3", "7", "5", "9"],
            ["9", "6", "5", "4", "2", "7", "1", "3", "8"],
        ],
    ];
    const examples: {
        input: string[][];
        output: string[][];
    }[] = inputs.map((v, i) => ({ input: v, output: outputs[i] }));
    examples.forEach(({ input, output }) => {
        solveSudoku(input);
        // console.log(input);
        assertEquals(output, input);
    });
});
